﻿#include "Button1.h"

// 
// bool Label3::init(const string &text)
// {
// 	if (!Label2::init(text, cfg::fntSizeNormal))
// 	{
// 		return false;
// 	}
// 
// 	Mouse *m = Mouse::create(this);
// 	m->setDragable(true);
// 
// 	return true;
// }
// 
// 
// bool Button::init(ulong uid, const Size& size)
// {
// 	if (uid)
// 	{
// 		if (!Sprite2::init(uid, "", nullptr))
// 		{
// 			return false;
// 		}
// 	}
// 	else
// 	{
// 		Sprite2::setContentSize(size);
// 	}
// 	
// 	this->addChild(_label = Label2::create(""));
// 	_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
// 	_label->setPosition(_vecLabal = getContentSize() / 2);
// 
// 	Mouse *m = Mouse::create(this);
// 	m->onState = [&,uid](Node *node, const Mouse::eState& e)
// 	{
// 		switch (e)
// 		{
// 		case Mouse::eState::Normal:
// 			if (uid)
// 			{
// 				setFrame(0);
// 			}
// 			else
// 			{
// //				setLineColor(Color3B::WHITE);
// 			}
// 			_label->setColor(Color3B::WHITE);
// 			_label->setPosition(_vecLabal);
// 	
// 			break;
// 		case Mouse::eState::Over:
// 			if (uid)
// 			{
// 				setFrame(2);
// 			}
// 			else
// 			{
// //				setLineColor(Color3B::YELLOW);
// 			}
// 			_label->setColor(Color3B::YELLOW);
// 
// 			break;
// 		case Mouse::eState::Down:
// 			if (uid)
// 			{
// 				setFrame(1);
// 			}
// 			else
// 			{
// //				setLineColor(Color3B::BLUE);
// 			}
// 			_label->setColor(Color3B::WHITE);
// 			_label->setPosition(_vecLabal + Vec2(1, -1));
// 			if (_notify && _notify->onNotify)
// 			{
// 				_notify->onNotify(this);
// 			}
// 			break;
// 		case Mouse::eState::Disabled:
// 			if (uid)
// 			{
// 				setFrame(3);
// 			}
// 			else
// 			{
// //				setLineColor(Color3B::GRAY);
// 			}
// 			_label->setColor(Color3B::GRAY);
// 
// 			break;
// 		default:
// 			break;
// 		}
// 	};
// 
// 	m->onUp = [&](Node *, bool isLeft)
// 	{
// 		if (isLeft)
// 		{
// 			if (onClick)
// 			{
// 				onClick(this);
// 			}
// 		}
// 	};
// 
// 	m->setDragable(true);
// 	return true;
// }
// 
// 
// 
// bool WinPad::init(ulong uid)
// {
// 	if (!Sprite2::init(uid, "", nullptr))
// 	{
// 		return false;
// 	}
// 	
// 	addChild(_label = Label2::create("", cfg::fntSizeTitle));
// 	_label->setPositionX(getContentSize().width / 2);
// 	_label->setPositionY(getContentSize().height);
// 
// 	onOpenClose = [&](WinPad*, bool isOpen)
// 	{
// 		setVisible(isOpen);
// 		if (isOpen)
// 		{
// 			reorder();
// 		}
// 	};
// 
// 	addChildPosition(_btnClose = Button::create(cfg::uBtnCancal), getContentSize().width - _btnClose->getContentSize().width - 3, 3);
// 	_btnClose->onClick = [&](Button*)
// 	{
// 		onOpenClose(this, false);
// 	};
// 
// 	Mouse *m = Mouse::create(this);
// 	m->onUp = [&](Node*, bool isLeft)
// 	{
// 		if (!isLeft && _isClose)
// 		{
// 			onOpenClose(this, false);
// 		}
// 	};
// 	m->onDown = [&](Node*, bool isLeft)
// 	{
// 		if (isLeft/* && this == Director::getInstance()->getSnatchNode()*/)
// 		{
// 			reorder();
// 		}
// 	};
// 
// 	onNotify = [&](Button*)
// 	{
// 		reorder();
// 	};
// 
// //	setAnchorPoint(Vec2::ZERO);
// 	m->setDragable(true);
// 	this->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
// 	return true;
// }
// 
// void WinPad::addChildPosition(Node *node, float x, float y)
// {
// 	this->addChild(node);
// 	node->setPositionX(x);
// 	node->setPositionY(this->getContentSize().height - y/* - btn->getContentSize().height*/);
// // 	if (node->getType() == eNodeType::Label)
// // 	{
// // 		node->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
// // 	}
// // 	else if (node->getType() == eNodeType::Button)
// // 	{
// // 		Button *btn = (Button*)node;
// // 		btn->_notify = this;
// // 	}
// }



Button1::~Button1()
{
	if (_pad)
	{
		_pad->removeChildSnatch(this);
	}
}

// bool Button1::init(ulong uid, const string& filename, const string& text)
// {
// 	if (!Sprite9::init(uid, filename))
// 	{
// 		return false;
// 	}
// 
// 	this->addChild(_label = Label2::create(text));
// 	_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
// 	_label->setPosition(_contentSize / 2);
// 	_label->disableEffect();
// 	_label->setColor(Color3B::WHITE);
// 	_vecLabal = _label->getPosition();
// 	_colorLabel = _label->getColor();
// 	return true;
// }
// 
// bool Button1::init(ulong uid, const string& filename, int edge, const Size& contentSize, const string& text)
// {
// 	if (!Sprite9::init(uid, filename, edge, contentSize))
// 	{
// 		return false;
// 	}
// 
// 	this->addChild(_label = Label2::create(text));
// 	_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
// 	_label->setPosition(_contentSize / 2);
// 	_label->disableEffect();
// 	_label->setColor(Color3B::WHITE);
// 	_vecLabal = _label->getPosition();
// 	_colorLabel = _label->getColor();
// 	return true;
// }

bool Button1::init(const string& text, const Size& size)
{
	if (!Node2::init())
	{
		return false;
	}
	_sprite = gge::Sprite_Create(nullptr, 0, 0, size.width, size.height);

// 	_fnt = gge::Font_Create(cfg::getFntName().c_str(), cfg::fntSizeNormal);
// 	asert(_fnt, "font crate fail: %s", cfg::getFntName().c_str());
// 	_fnt->SetAlign(gge::FONT_ALIGN::TEXT_CENTER);
// 	setString(text);
	this->addChild(_label = Label1::create(text));
//	_label->setAlignCenter();
	_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
	_label->setPosition(size / 2);

	this->addChild(_drawNode = DrawNode::create());
	_drawNode->setContentSize(size);

	setOpacity(0x88);
	setFrame(0);
	return true;
}


void Button1::setString(const string &text)
{
//	_text = text;
//	static gge::ggeFont::StringInfo s_info;
// 	_fnt->GetStringInfo(_text.c_str(), s_info);
// 	Node2::setContentSize(Size(s_info.Width, s_info.Height));
	_label->setString(text);
}


void Button1::setEnabled(bool isEnabled)
{
	if (_isEnabled == isEnabled)
	{
		return;
	}
	_isEnabled = isEnabled;
	if (!isEnabled)
	{
		setFrame(3);
	}
}

bool Button1::setFrame(int frame)
{
	_frame = frame;
// 	if (!_label)
// 	{
// 		return false;
// 	}
// 	if (frame == 0)
// 	{
// 		_label->setPosition(_vecLabal);
// 		_label->setColor(_colorLabel);
// 	}
// 	else if (frame == 1)
// 	{
// 		_label->setColor(Color3B::RED);
// 		_label->setPosition(_vecLabal + Vec2(1,-1));
// 	}
// 	else if (frame == 2)
// 	{
// 		_label->setColor(Color3B::YELLOW);
// 	}
// 	else if (frame == 3)
// 	{
// 		_label->setColor(Color3B::GRAY);
// 	}
	if (frame == 0)
	{
		setColor(Color3B::BLUE);
	}
	else if (frame == 1)
	{
		setColor(Color3B::GREEN);
	}
	else if (frame == 2)
	{
		setColor(Color3B::YELLOW);
	}
	else if (frame == 3)
	{
		setColor(Color3B::GRAY);
	}
	int a = _frame == 1 ? 1 : 0;
	_drawNode->setPosition(a, -a);
	return true;
}



void Button1::render(uint32_t flags, const array<Vec2, 4>& vecRenders, const Vec2& vecAp)
{
	int a = _frame == 1 ? 1 : 0;
//	_fnt->Render(vecRenders[0].x + a, vecRenders[0].y - a, _text.c_str());

	if (_isSpriteVisible)
	{
		if (flags)
		{
			_sprite->SetPosition4V(
				vecRenders[0].x + a, vecRenders[1].y - a,
				vecRenders[1].x + a, vecRenders[1].y - a,
				vecRenders[2].x + a, vecRenders[2].y - a,
				vecRenders[3].x + a, vecRenders[3].y - a);
		}
		_sprite->RenderPosition();
	}
}


// 
// bool Button2::init(ulong uid, const string& filename, const string& text)
// {
// 	if (!Sprite2::init(uid, filename,nullptr, 0))
// 	{
// 		return false;
// 	}
//  	_isAp = false;
// // 	this->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
// 
// 	if (!Button1::init(this, text))
// 	{
// 		return false;
// 	}
// 	return true;
// }
// 
// 
// 
// bool Button9::init(ulong uid, const string& filename, const Size& size, const string& text)
// {
// 	if (!Sprite9::init(uid, filename, size, 16, 16, 16, 16))
// 	{
// 		return false;
// 	}
// // 	this->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
// 
// 	if (!Button1::init(this, text))
// 	{
// 		return false;
// 	}
// 
// 	return true;
// }
// 
// 
// 
// bool Pad::init(bool isHadBtnClose, const string& text)
// {
// 	this->addChild(_label = Label2::create(text, cfg::fntSizeTitle));
// 	_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE_TOP);
// 	_label->setPositionX(_contentSize.width / 2);
// 	_label->setPositionY(_contentSize.height);
// 
// 	if (isHadBtnClose)
// 	{
// 		Button1* btnClose = Button1::create(cfg::uBtnCancal);
// 		addChildSnatch(btnClose);
// 		btnClose->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
// 		btnClose->setPosition(_contentSize);
// 		btnClose->onClick = [&](Button1*)
// 		{
// 			this->setVisible(false);
// 		};
// 	}
// 	_isDragged = true;
// 	this->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
// 	return true;
// }
// 
// 
// bool Pad::init(ulong uid, const string& filename, bool isHadBtnClose, const string& text)
// {
// 	if (!Sprite9::init(uid, filename))
// 	{
// 		return false;
// 	}
// 
// 	return init(isHadBtnClose, text);
// }
// 
// bool Pad::init(ulong uid, const string& filename, int edge, const Size& contentSize, bool isHadBtnClose, const string& text)
// {
// 	if (!Sprite9::init(uid, filename, edge, contentSize))
// 	{
// 		return false;
// 	}
// 	return init(isHadBtnClose, text);
// }

bool Pad::init(const Size& size, const string& text, bool isHadBtnClose)
{
	if (!LayerColor::init())
	{
		return false;
	}
	LayerColor::setContentSize(size);
	_cascadeColorEnabled = false;
	_cascadeOpacityEnabled = false;
	this->addChild(_label = Label1::create(text));
//	_label->setAlignCenter();
	_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
	_label->setPosition(size.width / 2, size.height - _label->getContentSize().height);

	this->addChild(_drawNode = DrawNode::create());
	_drawNode->setContentSize(size);

	if (isHadBtnClose)
	{
		Button1* btnClose = Button1::create("×", Size(32, 32));
		addChildSnatch(btnClose);
		btnClose->setAnchorPoint(Vec2::ANCHOR_TOP_RIGHT);
		btnClose->setPosition(size);
		btnClose->onClick = [&](Button1*)
		{
			this->setVisible(false);
		};
	}

	setOpacity(0x88);
	return true;
}


void Pad::addChildSnatch(Button1 *btn)
{
	LayerColor::addChild(btn);
	if (btn->getParent() == this)
	{
		btn->_pad = this;
		_buttons.push_back(btn);
	}
}


void Pad::removeChildSnatch(Button1 *btn)
{
	forr(_buttons, i)
	{
		if (_buttons[i] == btn)
		{
			_buttons.erase(_buttons.begin() + i);
// 			if (btn == _palManager->_btn)
// 			{
// 				_palManager->_btn = nullptr;
// 			}
			return;
		}
	}
}


void Pad::setVisible(bool visible)
{
	LayerColor::setVisible(visible);
	if (visible)
	{
		setLocalZOrder(++_palManager->_z);
	}
	if (onVisible)
	{
		onVisible(this, visible);
	}
}



Button1* Pad::getButton(Vec2 location)
{
	for (const auto& node : _buttons)
	{
		if (!node->isVisible())
		{
			continue;
		}
		if (node->getBoundingBox().containsPoint(convertToNodeSpace(location)))
		{
			return node;
		}
	}
	return nullptr;
}




// bool Pad2::init(ulong uid, const string& filename, bool isCloseBtn, const string& text)
// {
// 	if (!Sprite2::init(uid, filename, nullptr, 0))
// 	{
// 		return false;
// 	}
//  	_isAp = false;
//  	this->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
// 
// 	if (!Pad::init(this, text, isCloseBtn))
// 	{
// 		return false;
// 	}
// 
// 	this->setDragged(true);
// 	return true;
// }
// 
// 
// 
// bool Pad9::init(ulong uid, const string& filename, const Size& size, bool isCloseBtn, const string& text)
// {
// 	if (!Sprite9::init(uid, filename, size, 16, 16, 16, 16))
// 	{
// 		return false;
// 	}
// 	this->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
// 
// 	if (!Pad::init(this, text, isCloseBtn))
// 	{
// 		return false;
// 	}
// 
// 	this->setDragged(true);
// 	return true;
// }
//


bool PadManager::init()
{
	if (!Node::init())
	{
		return false;
	}

// 	EventListenerMouse* mouse = EventListenerMouse::create();
//	Mouse2* mouse = Mouse2::create(this);
// 	mouse->onMouseMove = [&](EventMouse* e)
//	{
// 		if (_isTouching)
// 		{
// 			return;
// 		}
//
// 		Vec2 vecCursor = ccg::getMouse();
//  		vecCursor.x = e->getCursorX();
//  		vecCursor.y = e->getCursorY();
// 
// 		_padTop = getPadTop(vecCursor);
// 		if (!_padTop)
// 		{
// 			return;
// 		}
// 
// 		Button1* btnCurr = _padTop->getButton(vecCursor);
// 		if (btnCurr == _btn)
// 		{
// 			return;
// 		}
// 		if (_btn)
// 		{
// 			if (_btn->isEnabled())
// 			{
// 				_btn->setFrame(0);
// 			}
// 		}
// 		if (btnCurr)
// 		{
// 			if (btnCurr->isEnabled())
// 			{
// 				btnCurr->setFrame(2);
// 			}
// 		}
// 		_btn = btnCurr;
//
//	};

//	mouse->onLup = [&](EventMouse* e)
//	if (gg::isRup())
//	{
// 		if (e->getMouseButton() != EventMouse::MouseButton::BUTTON_RIGHT)
// 		{
// 			return;
// 		}
// 		if (!_padTop)
// 		{
// 			return;
// 		}
// 
// 		if (_btn)
// 		{
// 			return;
// 		}
// 
// 		if (_padTop->_isCloseRup)
// 		{
// 			_padTop->setVisible(false);
// 		}
// 	};

//	_eventDispatcher->addEventListenerWithSceneGraphPriority(mouse, this);

	
	EventListenerTouchOneByOne *oneByone = EventListenerTouchOneByOne::create();
	
	oneByone->onTouchBegan = [&](Touch*t, Event* e)
	{
//		_isTouching = false;
		_delta = 0;
		_padTop = getPadTop(t->getLocation());
		if (!_padTop)
		{
			return false;
		}
		_padTop->setLocalZOrder(++_z);
		resortPad();

		Button1 *btnCurr = _padTop->getButton(t->getLocation());
		if (btnCurr == _btn)
		{	if (btnCurr && btnCurr->isEnabled())
			{
				btnCurr->setFrame(1);
			}
//			_isTouching = true;
//			scheduleUpdate();
			return true;
		}
		if (_btn)
		{
			if (_btn->isEnabled())
			{
				_btn->setFrame(0);
			}
		}
		if (btnCurr)
		{
			if (btnCurr->isEnabled())
			{
				btnCurr->setFrame(1);
			}
		}
		_btn = btnCurr;

		if (_padTop->_isDragged && !_btn)
		{
//			_vecDrag = _padTop->getPosition();
//			_vecDrag -= this->convertToNodeSpace(t->getLocation());
		}
//		scheduleUpdate();
//		_isTouching = true;
		return true;
	};

	oneByone->onTouchMoved = [&](Touch*t, Event* e)
	{
		if (_padTop->_isDragged && !_btn)
		{
//			_padTop->setPosition(_vecDrag + this->convertToNodeSpace(t->getLocation()));
			_padTop->setPosition(_padTop->getPosition() + this->convertToNodeSpace(t->getDelta()));
		}
	};

	oneByone->onTouchCancelled = oneByone->onTouchEnded = [&](Touch*t, Event* e)
	{
// 		if (s_pad->_onLup)
// 		{
// 			s_pad->_onLup(s_pad, _nodeTop->convertToNodeSpace(t->getLocation()));
// 		}
//		unscheduleUpdate();
		Button1 *btnCurr = _padTop->getButton(t->getLocation());
		if (btnCurr && btnCurr == _btn)
		{
			if (btnCurr->isEnabled())
			{
				if (btnCurr->onClick)
				{
					Node *parent = btnCurr->getParent();
					btnCurr->onClick(btnCurr);

					if (parent->getChildren().find(btnCurr) == parent->getChildren().end())
					{
						btnCurr = nullptr;
						_btn = nullptr;
					}
				}
				if (btnCurr)
				{
#ifdef ccc_mouse
					btnCurr->setFrame(2);
#else
					btnCurr->setFrame(0);
#endif
				}
			}
		}
		if (btnCurr != _btn)
		{
			if (_btn)
			{
				if (_btn->isEnabled())
				{
					_btn->setFrame(0);
				}
			}
			_btn = btnCurr;
		}

//		_isTouching = false;
	};

	_eventDispatcher->addEventListenerWithSceneGraphPriority(oneByone, this);
	this->scheduleUpdate();
	return true;
}


void PadManager::addChild(Pad* pad)
{
	Node::addChild(pad);
	if (pad->getParent() == this)
	{
		pad->_palManager = this;
		pad->setLocalZOrder(++_z);
		resortPad();
	}
}


void PadManager::resortPad()
{
	_sortPads = _children;
	std::sort(_sortPads.begin(), _sortPads.end(), [](Node* n1, Node* n2){return n1->getLocalZOrder() < n2->getLocalZOrder(); });
}


Pad* PadManager::getPadTop(Vec2 location)
{
	location = this->convertToNodeSpace(location);
	forr(_sortPads, i)
	{
		Node *node = _sortPads.at(i);
		if (node->isVisible() && node->getBoundingBox().containsPoint(location))
		{
			return static_cast<Pad*>(node);
		}
	}
	return nullptr;
}


void PadManager::update(float delta)
{
// 	Vec2 vecCursor = ccg::getMouse();
// 	gg::setTitle(cpp::toString("%.f, %.f", vecCursor.x, vecCursor.y));
// 	_padTop = getPadTop(vecCursor);
// 	if (_padTop)
// 	{
// 		Button1* btnCurr = _padTop->getButton(vecCursor);
// 		if (btnCurr != _btn)
// 		{
// 			if (_btn)
// 			{
// 				if (_btn->isEnabled())
// 				{
// 					_btn->setFrame(0);
// 				}
// 			}
// 			if (btnCurr)
// 			{
// 				if (btnCurr->isEnabled())
// 				{
// 					btnCurr->setFrame(2);
// 				}
// 			}
// 			_btn = btnCurr;
// 		}
// 	}
// 
// 	if (gg::isRup())
// 	{
// 		if (_padTop)
// 		{
// 			if (!_btn)
// 			{
// 				if (_padTop->_isCloseRup)
// 				{
// 					_padTop->setVisible(false);
// 				}
// 			}
// 		}
// 	}
// 
// 	if (_btn)
// 	{
// 		if (_btn->isEnabled())
// 		{
// 			if (_btn->onKeep)
// 			{
// 				Node *parent = _btn->getParent();
// 				_btn->onKeep(_btn, _delta += delta);
// 				if (parent->getChildren().find(_btn) == parent->getChildren().end())
// 				{
// 					_btn = nullptr;
// 				}
// 			}
// 		}
// 	}
}